package filter

import (
	. "TaylorTest/app"
	. "TaylorTest/model"
	"encoding/json"
	"fmt"
)

// RightFilter 权限验证中间件
// 继承自Filter结构体，用于验证用户是否有权限执行特定操作
// operationCode: 需要验证的权限代码
type RightFilter struct {
	Filter
	operationCode string
}

// OnEntry 在请求进入处理函数前执行
// 检查用户是否有权限访问当前操作
// 若无权限，返回错误信息并终止请求
func (filter *RightFilter) OnEntry(context *Context) {
	token, err := context.Request.Cookie("token")
	if err == nil {
		username := token.Value
		if !isUserHasRight(username, filter.operationCode) {
			if context.IsAjax() {
				result := JsonResult{IsSuccess: false, Message: "无权访问！"}
				resultJson, _ := json.Marshal(result)
				fmt.Fprintf(context.ResponseWriter, string(resultJson))
			} else {
				fmt.Fprintf(context.ResponseWriter, "无权访问！")
			}
			context.End()
		}
	} else {
		fmt.Println(err)
	}
}

// isUserHasRight 检查用户是否有指定权限
// username: 用户名
// code: 权限代码
// 返回: 是否有权限
func isUserHasRight(username string, code string) bool {
	right := getUserRight(username)
	if right != nil {
		return IndexOf(right.RightCodes, code)
	}
	return false
}

// getUserRight 获取用户的权限信息
// username: 用户名
// 返回: 用户的权限信息
func getUserRight(username string) *Right {
	filtBytes := FileReadAll("/appdata/rights.json")
	res := &[]Right{}
	json.Unmarshal(filtBytes, &res)
	rights := *res
	for i := 0; i < len(rights); i++ {
		if rights[i].UserName == username {
			return &rights[i]
		}
	}
	return nil
}

// NewRightFilter 创建新的RightFilter实例
// code: 需要验证的权限代码
// 返回: RightFilter指针
func NewRightFilter(code string) *RightFilter {
	return &RightFilter{operationCode: code}
}
